package com.itheima.leetcode.od.b.graph.unionfindset;

import java.util.Arrays;

/**
 * (A卷,200分)- 计算快递主站点（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 快递业务范围有N个站点，A站点与B站点可以中转快递，则认为A-B站可达，如果A-B可达，B-C可达，则A-C可达。
 * 现在给N个站点编号0、1、…n-1，用s[i][j]表示i-j是否可达，s[i][j]=1表示i-j可达，s[i][j]=0表示i-j不可达。
 * <p>
 * 现用二维数组给定N个站点的可达关系，请计算至少选择从几个主站点出发，才能可达所有站点（覆盖所有站点业务）。
 * <p>
 * 说明：s[i][j]与s[j][i]取值相同。
 * <p>
 * 输入描述
 * <p>
 * 第一行输入为N（1 < N < 10000），N表示站点个数。
 * 之后N行表示站点之间的可达关系，第i行第j个数值表示编号为i和j之间是否可达。
 * <p>
 * 输出描述
 * <p>
 * 输出站点个数，表示至少需要多少个主站点。
 * <p>
 * 用例
 * <p>
 * 输入	4
 * <p>
 * 1 1 1 1
 * <p>
 * 1 1 1 0
 * <p>
 * 1 1 1 0
 * <p>
 * 1 0 0 1
 * <p>
 * 输出	1
 * 说明	选择0号站点作为主站点，0站点可达其他所有站点，
 * 所以至少选择1个站点作为主站才能覆盖所有站点业务。
 * <p>
 * 输入	4
 * <p>
 * 1 1 0 0
 * <p>
 * 1 1 0 0
 * <p>
 * 0 0 1 0
 * <p>
 * 0 0 0 1
 * <p>
 * 输出	3
 * 说明
 * 选择0号站点可以覆盖0、1站点，
 * <p>
 * 选择2号站点可以覆盖2号站点，
 * <p>
 * 选择3号站点可以覆盖3号站点，
 * <p>
 * 所以至少选择3个站点作为主站才能覆盖所有站点业务
 */
public class CalculateMainDeliveryStation {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int[][] matrix = new int[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = sc.nextInt();
            }
        }*/

        int n = 4;

        String input = "1 1 1 1\n1 1 1 0\n1 1 1 0\n1 0 0 1";
        int[][] matrix = Arrays.stream(input.split("\n"))
                .map(s -> Arrays.stream(s.split(" "))
                        .mapToInt(Integer::parseInt)
                        .toArray())
                .toArray(int[][]::new);

        System.out.println(getResult(matrix, n));
    }

    public static int getResult(int[][] matrix, int n) {
        UnionFindSet ufs = new UnionFindSet(n);

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (matrix[i][j] == 1) {
                    ufs.union(i, j);
                }
            }
        }

        return ufs.connectedCount;
    }
}